package com.dms.modules.user.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.dms.modules.user.dto.*;
import com.dms.modules.user.entity.User;
import com.dms.modules.user.entity.UserAddress;
import com.dms.modules.user.entity.UserFavorite;
import com.dms.modules.user.vo.UserInfoVO;
import com.dms.modules.merchant.dto.MerchantApplyDTO;

import java.util.List;

public interface UserCenterService extends IService<User> {
    
    /**
     * 用户注册
     * @param registerDTO 注册信息
     * @return 用户ID
     */
    Long register(UserRegisterDTO registerDTO);
    
    /**
     * 获取用户信息
     * @param userId 用户ID
     * @return 用户信息
     */
    UserInfoVO getUserInfo(Long userId);
    
    /**
     * 更新用户信息
     * @param userId 用户ID
     * @param updateDTO 用户信息
     */
    void updateUserInfo(Long userId, UserUpdateDTO updateDTO);
    
    /**
     * 获取用户地址列表
     * @param userId 用户ID
     * @return 地址列表
     */
    List<UserAddress> getAddressList(Long userId);
    
    /**
     * 添加地址
     * @param userId 用户ID
     * @param addressDTO 地址信息
     * @return 地址ID
     */
    Long addAddress(Long userId, AddressDTO addressDTO);
    
    /**
     * 更新地址
     * @param userId 用户ID
     * @param addressId 地址ID
     * @param addressDTO 地址信息
     * @return 是否成功
     */
    boolean updateAddress(Long userId, Long addressId, AddressDTO addressDTO);
    
    /**
     * 删除地址
     * @param userId 用户ID
     * @param addressId 地址ID
     * @return 是否成功
     */
    boolean deleteAddress(Long userId, Long addressId);
    
    /**
     * 设置默认地址
     * @param userId 用户ID
     * @param addressId 地址ID
     * @return 是否成功
     */
    boolean setDefaultAddress(Long userId, Long addressId);
    
    /**
     * 获取默认地址
     * @param userId 用户ID
     * @return 默认地址
     */
    UserAddress getDefaultAddress(Long userId);
    
    /**
     * 获取收藏列表
     * @param userId 用户ID
     * @param type 收藏类型
     * @param pageNum 页码
     * @param pageSize 每页大小
     * @return 收藏列表
     */
    IPage<UserFavorite> getFavoriteList(Long userId, Integer type, Integer pageNum, Integer pageSize);
    
    /**
     * 添加收藏
     * @param userId 用户ID
     * @param favoriteDTO 收藏信息
     * @return 是否成功
     */
    boolean addFavorite(Long userId, FavoriteDTO favoriteDTO);
    
    /**
     * 取消收藏
     * @param userId 用户ID
     * @param favoriteId 收藏ID
     * @return 是否成功
     */
    boolean cancelFavorite(Long userId, Long favoriteId);
    
    /**
     * 修改密码
     * @param userId 用户ID
     * @param oldPassword 旧密码
     * @param newPassword 新密码
     */
    void changePassword(Long userId, String oldPassword, String newPassword);
    
    /**
     * 重置密码
     * @param phone 手机号
     * @param newPassword 新密码
     */
    void resetPassword(String phone, String newPassword);
    
    /**
     * 获取用户资料
     * @param userId 用户ID
     * @return 用户资料
     */
    User getProfile(Long userId);
    
    /**
     * 更新用户资料
     * @param userId 用户ID
     * @param profileDTO 用户资料
     * @return 是否成功
     */
    boolean updateUserProfile(Long userId, UserProfileDTO profileDTO);
    
    /**
     * 更新用户资料
     * @param userId 用户ID
     * @param updateProfileDTO 用户资料
     * @return 是否成功
     */
    boolean updateProfile(Long userId, UpdateProfileDTO updateProfileDTO);
    
    /**
     * 更新密码
     * @param userId 用户ID
     * @param updatePasswordDTO 密码信息
     * @return 是否成功
     */
    boolean updatePassword(Long userId, UpdatePasswordDTO updatePasswordDTO);
    
    /**
     * 更新头像
     * @param userId 用户ID
     * @param avatarUrl 头像URL
     * @return 是否成功
     */
    boolean updateAvatar(Long userId, String avatarUrl);
    
    /**
     * 更新手机号
     * @param userId 用户ID
     * @param phone 手机号
     * @return 是否成功
     */
    boolean updatePhone(Long userId, String phone);
    
    /**
     * 更新邮箱
     * @param userId 用户ID
     * @param email 邮箱
     * @return 是否成功
     */
    boolean updateEmail(Long userId, String email);
    
    /**
     * 处理商家申请
     * @param userId 用户ID
     * @param applyDTO 申请信息
     */
    void handleMerchantApply(Long userId, MerchantApplyDTO applyDTO);

    /**
     * 发送验证码
     * @param phone 手机号
     * @param type 验证码类型
     */
    void sendVerifyCode(String phone, Integer type);
}